﻿using System.Collections.Generic;
using Geometries = GisSharpBlog.NetTopologySuite.Geometries;

namespace AzukiMap.MapSource
{
    public class OpenStreetMapSource : MercatorQuadTileSource
    {
        OpenStreetMapTileType _tileType;

        public OpenStreetMapSource(OpenStreetMapTileType tileType)
            : base("OpenStreetMap")
        {
            init(tileType);
        }

        public OpenStreetMapSource(string name, OpenStreetMapTileType tileType)
            : base(name)
        {
            init(tileType);
        }

        void init(OpenStreetMapTileType tileType)
        {
            _dpi = 96;
            _tileHeight = 256;
            _tileWidth = 256;
            _tileType = tileType;
            Srid = 3785;
            //_maxExtent = new Geometries.Envelope(-180, 180, -85.05112878, 85.05112878);
            MaxExtent = _geoUtil.CreateExtentPolygon(-180, 180, -85.05112878, 85.05112878);
            MaxExtent.SRID = Srid;

            SetBaseUris();
            SetScales();
        }

        void SetBaseUris()
        {
            switch (_tileType)
            {
                case OpenStreetMapTileType.MAPNIK:
                    _baseUris.Add("http://a.tile.openstreetmap.org/");
                    _baseUris.Add("http://b.tile.openstreetmap.org/");
                    _baseUris.Add("http://c.tile.openstreetmap.org/");
                    break;
                case OpenStreetMapTileType.OSMARENDER:
                    _baseUris.Add("http://a.tah.openstreetmap.org/Tiles/tile/");
                    _baseUris.Add("http://b.tah.openstreetmap.org/Tiles/tile/");
                    _baseUris.Add("http://c.tah.openstreetmap.org/Tiles/tile/");
                    break;
                case OpenStreetMapTileType.CYCLEMAP:
                    _baseUris.Add("http://a.andy.sandbox.cloudmade.com/tiles/cycle/");
                    _baseUris.Add("http://b.andy.sandbox.cloudmade.com/tiles/cycle/");
                    _baseUris.Add("http://c.andy.sandbox.cloudmade.com/tiles/cycle/");
                    break;
                default:
                    _baseUris.Add("http://a.tile.openstreetmap.org/");
                    _baseUris.Add("http://b.tile.openstreetmap.org/");
                    _baseUris.Add("http://c.tile.openstreetmap.org/");
                    break;
            }
        }

        void SetScales()
        {
            SetZoomLevels();
            foreach (KeyValuePair<double, int> level in _scaleLevels)
            {
                _scales.Add(level.Key);
            }
            _scales.Sort();
        }

        void SetZoomLevels()
        {
            _scaleLevels.Add(295829355.5,1);
            _scaleLevels.Add(147914677.7,2);
            _scaleLevels.Add(73957338.86,3);
            _scaleLevels.Add(36978669.43,4);
            _scaleLevels.Add(18489334.72,5);
            _scaleLevels.Add(9244667.36,6);
            _scaleLevels.Add(4622333.68,7);
            _scaleLevels.Add(2311166.84,8);
            _scaleLevels.Add(1155583.42,9);
            _scaleLevels.Add(577791.71,10);
            _scaleLevels.Add(288895.85,11);
            _scaleLevels.Add(144447.93,12);
            _scaleLevels.Add(72223.96,13);
            _scaleLevels.Add(36111.98,14);
            _scaleLevels.Add(18055.99,15);
            _scaleLevels.Add(9028,16);
            _scaleLevels.Add(4514,17);
            if (_tileType == OpenStreetMapTileType.MAPNIK)
            {
                _scaleLevels.Add(2257, 18);
            }
        }

    }

    public enum OpenStreetMapTileType
    {
        MAPNIK,
        OSMARENDER,
        CYCLEMAP,
    }
}